package com.zx._01_基础._013_io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import junit.framework.TestCase;

public class Demo_04_RandomAccessFile extends TestCase {

    /**
     * 向指定的文件中指定的位置处插入文本
     *
     * @param fileName
     * @param pos
     * @param insertContent
     * @throws IOException
     */
    public static void insertTXT(String fileName, long pos, String insertContent) throws IOException {
        //创建一个临时的文件,注意：这个文件是空的
        File tempFile = File.createTempFile("tmp", null);
        //在JVM退出时自动删除
        tempFile.deleteOnExit();
        //读取这个文件
        RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
        //使用临时保存插入值之后的数据
        FileOutputStream tmpOut = new FileOutputStream(tempFile);

        //定位到插入点
        raf.seek(pos);

        byte[] buf = new byte[1024];

        int hasRead = 0;
        //将插入点之后的数据保存在临时文件中
        while ((hasRead = raf.read(buf)) != -1) {
            tmpOut.write(buf, 0, hasRead);
        }
        //再次定位到插入点
        raf.seek(pos);
        //在原文件中插入要插入的信息
        raf.write(insertContent.getBytes());

        //读取保留有原来的插入点之后的文字的临时文件
        FileInputStream tmpIn = new FileInputStream(tempFile);
        //读取临时文件中保存的插入点之后的文字
        while ((hasRead = tmpIn.read(buf)) != -1) {
            raf.write(buf, 0, hasRead);
        }
        tmpIn.close();
        tmpOut.close();
        raf.close();

    }

    public void test1() throws IOException {
//		RandomAccessFile(String name, String mode)
//		mode是访问模式：
//		r只读
//		rw 读写，没有文件的话则创建
//		rws 读写，对文件内容和元数据的每次更新都同步存储到底层
//		rwd 读写，对文件内容的每次更新都同步存储到底层
        RandomAccessFile raf = new RandomAccessFile("src/io_read.txt", "r");//创建对象的时候，默认读取的初始位置是0
        System.out.println(raf.getFilePointer());//获得当前文件的读取位置

        raf.seek(300);//1.移动访问文件指针的指向字节
        System.out.println(raf.getFilePointer());//获得当前文件的读取位置
    }

    public void test2() throws IOException {
        RandomAccessFile raf = new RandomAccessFile("src/io_read.txt", "r");

        byte[] buf = new byte[1024];//读取文件
        int len = 0;
        while ((len = raf.read(buf)) != -1) {
            System.out.println(new String(buf, "UTF-8"));
        }
    }

    public void test3() throws IOException {
        RandomAccessFile raf = new RandomAccessFile("src/io_read.txt", "rw");
        raf.seek(raf.length());//找到文本的末尾
        raf.write("哈哈".getBytes());//在当前文件的读取位置追加内容
    }

    public void test4() throws IOException {
        insertTXT("src/io_read.txt", 10, "插入的内容");
    }


}
